﻿// Inner Fire 游戏引擎库
// LayerSetting - 游戏层配置
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于配置一个层系列的信息。讲道理来说应该整个游戏框架下只需要一个层的配置。
// 因为如果在以后的扩展中，每个玩家使用不同的层，那么就会导致“语言不通”，这非常蛋痛。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-24

#pragma once

#include <EASTL/vector.h>
#include <element.h>
#include <game/config/config_info.h>
#include <xml_reader.h>
#include <EASTL/string_view.h>
#include <EASTL/string.h>

namespace ifire::game {
class ConfigManager;

struct LayerInfo {
  // 层的索引ID
  int id;  
  // 名称
  ikit::sstr name;

  LayerInfo(const ikit::XmlNode& node);
};

struct MaskInfo{
  // 名称
  ikit::sstr name;
  // 所有的Layer的列表
  eastl::string list;
  // 计算出来的掩码
  uint64_t mask;

  MaskInfo(const ikit::XmlNode& node);
};

class LayerSetting : public ConfigInfo {
public:
  LayerSetting(ConfigManager* manager, const ikit::XmlNode& node);
  LayerSetting(const LayerSetting& lhs) = delete;
  LayerSetting& operator=(const LayerSetting& lhs) = delete;
  ~LayerSetting();

  // 通过名称获得ID
  int GetLayer(ikit::sstr name);
  // 通过名称获得Mask
  uint64_t GetMask(ikit::sstr name);

  // 通过一个名称的列表计算Mask，格式为"LayerName,LayerName"，因为没有Trim能力，所以不能有空格
  uint64_t CalculateLayerMask(const eastl::string_view& name_list);

private:
  // 层的配置
  eastl::vector<LayerInfo> layers_;
  // 掩码的配置
  eastl::vector<MaskInfo> masks_;
};

using LayerSettingPtr = std::unique_ptr<LayerSetting>;

} // namespace ifire::game